home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / cg.lha / cg / src / TreeMod2.mi < prev    next >
Text File  |  1992-11-24  |  32KB  |  968 lines

  1. IMPLEMENTATION MODULE TreeMod2;
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15. IMPORT SYSTEM, System, IO, Tree;
  16. (* line 15 "" *)
  17.  
  18.  
  19. FROM IO        IMPORT WriteS, WriteNl;
  20. FROM Sets    IMPORT IsElement;
  21. FROM Idents    IMPORT tIdent;
  22. FROM Positions    IMPORT tPosition;
  23.  
  24. FROM Tree    IMPORT
  25.    NoTree    , tTree        , Options    , ClassCount    ,
  26.    f        , WI    , WN    , iInteger    , itTree    ,
  27.    iNoTree    , iModule    , iMain        , HasChildren    ,
  28.    HasAttributes, NoCodeAttr    , NoCodeClass    ,
  29.    ForallClasses, ForallAttributes, Reverse    ;
  30.  
  31. VAR
  32.    iClassName    : tIdent;
  33.    RevChild    : tTree;
  34.  
  35. PROCEDURE WriteLine (Line: tPosition);
  36.    BEGIN
  37.       IF Line.Line # 0 THEN
  38.      WriteS (f, "(* line "); WN (Line.Line); WriteS (f, ' "'); WI (Line.File); WriteS (f, '" *)'); WriteNl (f);
  39.       END;
  40.    END WriteLine;
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141. PROCEDURE yyAbort (yyFunction: ARRAY OF CHAR);
  142.  BEGIN
  143.   IO.WriteS (IO.StdError, 'Error: module TreeMod2, routine ');
  144.   IO.WriteS (IO.StdError, yyFunction);
  145.   IO.WriteS (IO.StdError, ' failed');
  146.   IO.WriteNl (IO.StdError);
  147.   Exit;
  148.  END yyAbort;
  149.  
  150. PROCEDURE yyIsEqual (yya, yyb: ARRAY OF SYSTEM.BYTE): BOOLEAN;
  151.  VAR yyi    : INTEGER;
  152.  BEGIN
  153.   FOR yyi := 0 TO INTEGER (HIGH (yya)) DO
  154.    IF yya [yyi] # yyb [yyi] THEN RETURN FALSE; END;
  155.   END;
  156.   RETURN TRUE;
  157.  END yyIsEqual;
  158.  
  159. PROCEDURE TreeIO (t: Tree.tTree);
  160.  VAR yyTempo: RECORD CASE : INTEGER OF
  161.  END; END;
  162.  BEGIN
  163.   IF t = Tree.NoTree THEN RETURN; END;
  164.   IF (t^.Kind = Tree.Ag) THEN
  165. (* line 43 "" *)
  166.      WITH t^.Ag DO
  167. (* line 43 "" *)
  168.       
  169.     WriteS (f, "TYPE yyPtrtTree    = POINTER TO "); WI (itTree); WriteS (f, ";"); WriteNl (f);
  170.     WriteNl (f);
  171.     WriteS (f, "VAR yyf    : IO.tFile;"); WriteNl (f);
  172.     WriteS (f, "VAR yyLabel    : SHORTCARD;"); WriteNl (f);
  173.     WriteS (f, "VAR yyKind    : SHORTCARD;"); WriteNl (f);
  174.     WriteS (f, "VAR yyc    : CHAR;"); WriteNl (f);
  175.     WriteS (f, "VAR yys    : Strings.tString;"); WriteNl (f);
  176.     WriteNl (f);
  177.       IF IsElement (ORD (','), Options) THEN
  178.     WriteS (f, "PROCEDURE yyMark (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
  179.     WriteS (f, " BEGIN"); WriteNl (f);
  180.     WriteS (f, "  LOOP"); WriteNl (f);
  181.     WriteS (f, "   IF yyt = "); WI (iNoTree); WriteS (f, " THEN RETURN; END;"); WriteNl (f);
  182.     WriteS (f, "   INC (yyt^.yyHead.yyMark);"); WriteNl (f);
  183.     WriteS (f, "   IF yyt^.yyHead.yyMark > 1 THEN RETURN; END;"); WriteNl (f);
  184.     WriteNl (f);
  185.     WriteS (f, "   CASE yyt^.Kind OF"); WriteNl (f);
  186.     ForallClasses (Classes, Mark);
  187.     WriteS (f, "   ELSE RETURN;"); WriteNl (f);
  188.     WriteS (f, "   END;"); WriteNl (f);
  189.     WriteS (f, "  END;"); WriteNl (f);
  190.     WriteS (f, " END yyMark;"); WriteNl (f);
  191.     WriteNl (f);
  192.       END;
  193.       IF IsElement (ORD (';'), Options) THEN
  194.         WriteS (f, "CONST yyInitTreeStoreSize    = 32;"); WriteNl (f);
  195.     WriteNl (f);
  196.         WriteS (f, "VAR yyTreeStoreSize    : LONGINT;"); WriteNl (f);
  197.         WriteS (f, "VAR yyTreeStorePtr    : POINTER TO ARRAY [0..50000] OF "); WI (itTree); WriteS (f, ";"); WriteNl (f);
  198.     WriteS (f, "VAR yyLabelCount    : INTEGER;"); WriteNl (f);
  199.     WriteS (f, "VAR yyRecursionLevel    : SHORTINT;"); WriteNl (f);
  200.     WriteNl (f);
  201.     WriteS (f, "PROCEDURE yyMapToLabel (yyTree: "); WI (itTree); WriteS (f, "): SHORTCARD;"); WriteNl (f);
  202.     WriteS (f, " VAR yyi    : INTEGER;"); WriteNl (f);
  203.     WriteS (f, " BEGIN"); WriteNl (f);
  204.     WriteS (f, "  FOR yyi := 1 TO yyLabelCount DO"); WriteNl (f);
  205.     WriteS (f, "   IF yyTreeStorePtr^[yyi] = yyTree THEN RETURN yyi; END;"); WriteNl (f);
  206.     WriteS (f, "  END;"); WriteNl (f);
  207.     WriteS (f, "  INC (yyLabelCount);"); WriteNl (f);
  208.     WriteS (f, "  IF yyLabelCount = yyTreeStoreSize THEN"); WriteNl (f);
  209.     WriteS (f, "   DynArray.ExtendArray (yyTreeStorePtr, yyTreeStoreSize, SYSTEM.TSIZE ("); WI (itTree); WriteS (f, "));"); WriteNl (f);
  210.     WriteS (f, "  END;"); WriteNl (f);
  211.     WriteS (f, "  yyTreeStorePtr^[yyLabelCount] := yyTree;"); WriteNl (f);
  212.     WriteS (f, "  RETURN yyLabelCount;"); WriteNl (f);
  213.     WriteS (f, " END yyMapToLabel;"); WriteNl (f);
  214.     WriteNl (f);
  215.     WriteS (f, "PROCEDURE yyMapToTree (yyLabel: SHORTCARD): "); WI (itTree); WriteS (f, ";"); WriteNl (f);
  216.     WriteS (f, " BEGIN RETURN yyTreeStorePtr^[yyLabel]; END yyMapToTree;"); WriteNl (f);
  217.     WriteNl (f);
  218.       END;
  219.       IF IsElement (ORD ('w'), Options) OR
  220.      IsElement (ORD ('o'), Options) THEN
  221.     WriteS (f, "PROCEDURE yyWriteNl; BEGIN IO.WriteNl (yyf); END yyWriteNl;"); WriteNl (f);
  222.     WriteNl (f);
  223.     WriteS (f, "PROCEDURE yyWriteSelector (yys: ARRAY OF CHAR);"); WriteNl (f);
  224.     WriteS (f, " BEGIN IO.WriteS (yyf, yys); Layout.WriteSpaces (yyf, 15 - INTEGER (HIGH (yys))); IO.WriteS (yyf, ' = '); END yyWriteSelector;"); WriteNl (f);
  225.     WriteNl (f);
  226.     WriteS (f, "PROCEDURE yyWriteHex (VAR yyx: ARRAY OF SYSTEM.BYTE);"); WriteNl (f);
  227.     WriteS (f, " VAR yyi    : INTEGER;"); WriteNl (f);
  228.     WriteS (f, " BEGIN"); WriteNl (f);
  229.     WriteS (f, "  FOR yyi := 0 TO INTEGER (HIGH (yyx)) DO"); WriteNl (f);
  230.     WriteS (f, "   IO.WriteN (yyf, ORD (CHAR (yyx [yyi])), 2, 16);"); WriteNl (f);
  231.     WriteS (f, "   IO.WriteC (yyf, ' ');"); WriteNl (f);
  232.     WriteS (f, "  END;"); WriteNl (f);
  233.     WriteS (f, " END yyWriteHex;"); WriteNl (f);
  234.     WriteNl (f);
  235.       END;
  236.       IF IsElement (ORD ('o'), Options) THEN
  237.     WriteS (f, "PROCEDURE yyWriteAdr (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
  238.     WriteS (f, " BEGIN"); WriteNl (f);
  239.     WriteS (f, "  IF yyt = "); WI (iNoTree); WriteS (f, " THEN"); WriteNl (f);
  240.     WriteS (f, "   IO.WriteS (yyf, '"); WI (iNoTree); WriteS (f, "');"); WriteNl (f);
  241.     WriteS (f, "  ELSE"); WriteNl (f);
  242.     WriteS (f, "   yyWriteHex (yyt);"); WriteNl (f);
  243.     WriteS (f, "  END;"); WriteNl (f);
  244.     WriteS (f, "  yyWriteNl;"); WriteNl (f);
  245.     WriteS (f, " END yyWriteAdr;"); WriteNl (f);
  246.     WriteNl (f);
  247.     ForallClasses (Classes, WriteNode);
  248.     WriteS (f, "PROCEDURE Write"); WI (iModule); WriteS (f, "Node (yyyf: IO.tFile; yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
  249.     WriteS (f, " BEGIN"); WriteNl (f);
  250.     WriteS (f, "  yyf := yyyf;"); WriteNl (f);
  251.     WriteS (f, "  IF yyt = "); WI (iNoTree); WriteS (f, " THEN"); WriteNl (f);
  252.     WriteS (f, "   IO.WriteS (yyf, '"); WI (iNoTree); WriteS (f, "'); yyWriteNl; RETURN;"); WriteNl (f);
  253.     WriteS (f, "  END;"); WriteNl (f);
  254.     WriteNl (f);
  255.     WriteS (f, "  CASE yyt^.Kind OF"); WriteNl (f);
  256.     ForallClasses (Classes, WriteNodeName);
  257.     WriteS (f, "  ELSE"); WriteNl (f);
  258.     WriteS (f, "  END;"); WriteNl (f);
  259.     WriteS (f, " END Write"); WI (iModule); WriteS (f, "Node;"); WriteNl (f);
  260.     WriteNl (f);
  261.       END;
  262.       IF IsElement (ORD ('w'), Options) THEN
  263.     WriteS (f, "VAR yyIndentLevel    : SHORTINT;"); WriteNl (f);
  264.     WriteNl (f);
  265.     WriteS (f, "PROCEDURE Write"); WI (iModule); WriteS (f, " (yyyf: IO.tFile; yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
  266.     WriteS (f, " VAR yySaveLevel    : SHORTINT;"); WriteNl (f);
  267.     WriteS (f, " BEGIN"); WriteNl (f);
  268.     WriteS (f, "  yyf := yyyf;"); WriteNl (f);
  269.     WriteS (f, "  IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;"); WriteNl (f);
  270.     WriteS (f, "  INC (yyRecursionLevel);"); WriteNl (f);
  271.     WriteS (f, "  yyMark (yyt);"); WriteNl (f);
  272.     WriteS (f, "  yySaveLevel := yyIndentLevel;"); WriteNl (f);
  273.     WriteS (f, "  yyIndentLevel := 0;"); WriteNl (f);
  274.     WriteS (f, "  yyWrite"); WI (iModule); WriteS (f, " (yyt);"); WriteNl (f);
  275.     WriteS (f, "  yyIndentLevel := yySaveLevel;"); WriteNl (f);
  276.     WriteS (f, "  DEC (yyRecursionLevel);"); WriteNl (f);
  277.     WriteS (f, " END Write"); WI (iModule); WriteS (f, ";"); WriteNl (f);
  278.     WriteNl (f);
  279.     WriteS (f, "PROCEDURE yyIndentSelector (yys: ARRAY OF CHAR);"); WriteNl (f);
  280.     WriteS (f, " BEGIN Layout.WriteSpaces (yyf, yyIndentLevel); yyWriteSelector (yys); END yyIndentSelector;"); WriteNl (f);
  281.     WriteNl (f);
  282.     WriteS (f, "PROCEDURE yyIndentSelectorTree (yys: ARRAY OF CHAR; yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
  283.     WriteS (f, " BEGIN yyIndentSelector (yys); write"); WI (itTree); WriteS (f, " (yyt) END yyIndentSelectorTree;"); WriteNl (f);
  284.     WriteNl (f);
  285.     ForallClasses (Classes, WriteAttributes);
  286.     WriteS (f, "PROCEDURE yyWrite"); WI (iModule); WriteS (f, " (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
  287.     WriteS (f, " VAR yyLevel    : SHORTCARD;"); WriteNl (f);
  288.     WriteS (f, " BEGIN"); WriteNl (f);
  289.     WriteS (f, "  yyLevel := yyIndentLevel;"); WriteNl (f);
  290.     WriteS (f, "  LOOP"); WriteNl (f);
  291.     WriteS (f, "   IF yyt = "); WI (iNoTree); WriteS (f, " THEN"); WriteNl (f);
  292.     WriteS (f, "    IO.WriteS (yyf, ' "); WI (iNoTree); WriteS (f, "'); yyWriteNl; EXIT;"); WriteNl (f);
  293.     WriteS (f, "   ELSIF yyt^.yyHead.yyMark = 0 THEN"); WriteNl (f);
  294.     WriteS (f, "    IO.WriteC (yyf, '^'); IO.WriteI (yyf, yyMapToLabel (yyt), 0); yyWriteNl; EXIT;"); WriteNl (f);
  295.     WriteS (f, "   ELSIF yyt^.yyHead.yyMark > 1 THEN"); WriteNl (f);
  296.     WriteS (f, "    yyWriteNl; IO.WriteN (yyf, yyMapToLabel (yyt), 6, 10); IO.WriteC (yyf, ':');"); WriteNl (f);
  297.     WriteS (f, "    Layout.WriteSpaces (yyf, yyIndentLevel - 7);"); WriteNl (f);
  298.     WriteS (f, "   ELSE"); WriteNl (f);
  299.     WriteS (f, "    IO.WriteC (yyf, ' ');"); WriteNl (f);
  300.     WriteS (f, "   END;"); WriteNl (f);
  301.     WriteS (f, "   yyt^.yyHead.yyMark := 0;"); WriteNl (f);
  302.     WriteS (f, "   INC (yyIndentLevel, 2);"); WriteNl (f);
  303.     WriteNl (f);
  304.     WriteS (f, "   CASE yyt^.Kind OF"); WriteNl (f);
  305.     ForallClasses (Classes, WriteClassName);
  306.     WriteS (f, "   ELSE EXIT;"); WriteNl (f);
  307.     WriteS (f, "   END;"); WriteNl (f);
  308.     WriteS (f, "  END;"); WriteNl (f);
  309.     WriteS (f, "  yyIndentLevel := yyLevel;"); WriteNl (f);
  310.     WriteS (f, " END yyWrite"); WI (iModule); WriteS (f, ";"); WriteNl (f);
  311.     WriteNl (f);
  312.       END;
  313.       IF IsElement (ORD ('r'), Options) THEN
  314.     WriteS (f, "PROCEDURE Read"); WI (iModule); WriteS (f, " (yyyf: IO.tFile): "); WI (itTree); WriteS (f, ";"); WriteNl (f);
  315.     WriteS (f, " VAR yyt    : "); WI (itTree); WriteS (f, ";"); WriteNl (f);
  316.     WriteS (f, " BEGIN"); WriteNl (f);
  317.     WriteS (f, "  yyf := yyyf;"); WriteNl (f);
  318.     WriteS (f, "  IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;"); WriteNl (f);
  319.     WriteS (f, "  INC (yyRecursionLevel);"); WriteNl (f);
  320.     WriteS (f, "  IF NOT yyIsInitialized THEN"); WriteNl (f);
  321.     WriteS (f, "   yyInitKindToIdent; yyIsInitialized := TRUE;"); WriteNl (f);
  322.     WriteS (f, "  END;"); WriteNl (f);
  323.     WriteS (f, "  yyRead"); WI (iModule); WriteS (f, " (SYSTEM.ADR (yyt));"); WriteNl (f);
  324.     WriteS (f, "  DEC (yyRecursionLevel);"); WriteNl (f);
  325.     WriteS (f, "  RETURN yyt;"); WriteNl (f);
  326.     WriteS (f, " END Read"); WI (iModule); WriteS (f, ";"); WriteNl (f);
  327.     WriteNl (f);
  328.     WriteS (f, "PROCEDURE yyRead"); WI (iModule); WriteS (f, " (yyt: yyPtrtTree);"); WriteNl (f);
  329.     WriteS (f, " BEGIN"); WriteNl (f);
  330.     WriteS (f, "  LOOP"); WriteNl (f);
  331.     WriteS (f, "   CASE IO.ReadC (yyf) OF"); WriteNl (f);
  332.     WriteS (f, "   | '^': yyLabel := IO.ReadI (yyf); yyReadNl; yyt^ := yyMapToTree (yyLabel); RETURN;"); WriteNl (f);
  333.     WriteS (f, "   | 12C, '0': yyLabel := IO.ReadI (yyf); yyc := IO.ReadC (yyf);"); WriteNl (f);
  334.     WriteS (f, "    Layout.SkipSpaces (yyf); Strings.ReadL (yyf, yys);"); WriteNl (f);
  335.     WriteS (f, "    yyKind := yyMapToKind (yys); yyt^ := Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
  336.     WriteS (f, "    IF yyLabel # yyMapToLabel (yyt^) THEN IO.WriteS (IO.StdError, '"); WI (iModule); WriteS (f, ": error in Read"); 
  337.     WI (iModule); WriteS (f, "'); IO.WriteNl (IO.StdError); yyExit; END;"); WriteNl (f);
  338.     WriteS (f, "   ELSE"); WriteNl (f);
  339.     WriteS (f, "    Layout.SkipSpaces (yyf); Strings.ReadL (yyf, yys);"); WriteNl (f);
  340.     WriteS (f, "    yyKind := yyMapToKind (yys);"); WriteNl (f);
  341.     WriteS (f, "    IF yyKind = 0 THEN yyt^ := "); WI (iNoTree); WriteS (f, "; RETURN; END;"); WriteNl (f);
  342.     WriteS (f, "    yyt^ := Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
  343.     WriteS (f, "   END;"); WriteNl (f);
  344.     WriteNl (f);
  345.     WriteS (f, "   CASE yyKind OF"); WriteNl (f);
  346.     ForallClasses (Classes, ReadAttributes);
  347.     WriteS (f, "   ELSE RETURN;"); WriteNl (f);
  348.     WriteS (f, "   END;"); WriteNl (f);
  349.     WriteS (f, "  END;"); WriteNl (f);
  350.     WriteS (f, " END yyRead"); WI (iModule); WriteS (f, ";"); WriteNl (f);
  351.     WriteNl (f);
  352.     WriteS (f, "VAR yyKindToIdent    : ARRAY [0.."); WN (ClassCount); WriteS (f, "] OF Idents.tIdent;"); WriteNl (f);
  353.     WriteS (f, "VAR yyIsInitialized    : BOOLEAN;"); WriteNl (f);
  354.     WriteNl (f);
  355.     WriteS (f, "PROCEDURE yyMapToKind (VAR yys: Strings.tString): SHORTCARD;"); WriteNl (f);
  356.     WriteS (f, " VAR yyi    : Idents.tIdent;"); WriteNl (f);
  357.     WriteS (f, " VAR yyk    : SHORTCARD;"); WriteNl (f);
  358.     WriteS (f, " BEGIN"); WriteNl (f);
  359.     WriteS (f, "  yyi := Idents.MakeIdent (yys);"); WriteNl (f);
  360.     WriteS (f, "  FOR yyk := 0 TO "); WN (ClassCount); WriteS (f, " DO"); WriteNl (f);
  361.     WriteS (f, "   IF yyKindToIdent [yyk] = yyi THEN RETURN yyk; END;"); WriteNl (f);
  362.     WriteS (f, "  END;"); WriteNl (f);
  363.     WriteS (f, "  RETURN 0;"); WriteNl (f);
  364.     WriteS (f, " END yyMapToKind;"); WriteNl (f);
  365.     WriteNl (f);
  366.     WriteS (f, "PROCEDURE yyInitKindToIdent2 (yya: ARRAY OF CHAR; yyKind: SHORTCARD);"); WriteNl (f);
  367.     WriteS (f, " VAR yys    : Strings.tString;"); WriteNl (f);
  368.     WriteS (f, " BEGIN"); WriteNl (f);
  369.     WriteS (f, "  Strings.ArrayToString (yya, yys);"); WriteNl (f);
  370.     WriteS (f, "  yyKindToIdent [yyKind] := Idents.MakeIdent (yys);"); WriteNl (f);
  371.     WriteS (f, " END yyInitKindToIdent2;"); WriteNl (f);
  372.     WriteNl (f);
  373.     WriteS (f, "PROCEDURE yyInitKindToIdent;"); WriteNl (f);
  374.     WriteS (f, " BEGIN"); WriteNl (f);
  375.     WriteS (f, "  yyInitKindToIdent2 ('"); WI (iNoTree); WriteS (f, "', 0);"); WriteNl (f);
  376.     ForallClasses (Classes, InitKindToIdent);
  377.     WriteS (f, " END yyInitKindToIdent;"); WriteNl (f);
  378.     WriteNl (f);
  379.     WriteS (f, "PROCEDURE yyReadNl; BEGIN IO.ReadNl (yyf); END yyReadNl;"); WriteNl (f);
  380.     WriteNl (f);
  381.     WriteS (f, "PROCEDURE yyReadIdent (): Idents.tIdent;"); WriteNl (f);
  382.     WriteS (f, " VAR yys    : Strings.tString;"); WriteNl (f);
  383.     WriteS (f, " BEGIN"); WriteNl (f);
  384.     WriteS (f, "  Strings.ReadL (yyf, yys);"); WriteNl (f);
  385.     WriteS (f, "  IO.UnRead (yyf);"); WriteNl (f);
  386.     WriteS (f, "  RETURN Idents.MakeIdent (yys);"); WriteNl (f);
  387.     WriteS (f, " END yyReadIdent;"); WriteNl (f);
  388.     WriteNl (f);
  389.     WriteS (f, "PROCEDURE yyReadHex (VAR yyx: ARRAY OF SYSTEM.BYTE);"); WriteNl (f);
  390.     WriteS (f, " VAR yyi    : INTEGER;"); WriteNl (f);
  391.     WriteS (f, " BEGIN"); WriteNl (f);
  392.     WriteS (f, "  FOR yyi := 0 TO INTEGER (HIGH (yyx)) DO"); WriteNl (f);
  393.     WriteS (f, "   yyx [yyi] := SYSTEM.BYTE (CHR (CARDINAL (IO.ReadN (yyf, 16))));"); WriteNl (f);
  394.     WriteS (f, "  END;"); WriteNl (f);
  395.     WriteS (f, " END yyReadHex;"); WriteNl (f);
  396.     WriteNl (f);
  397.     WriteS (f, "PROCEDURE yySkip;"); WriteNl (f);
  398.     WriteS (f, " BEGIN"); WriteNl (f);
  399.     WriteS (f, "  REPEAT UNTIL IO.ReadC (yyf) = '='; yyc := IO.ReadC (yyf);"); WriteNl (f);
  400.     WriteS (f, " END yySkip;"); WriteNl (f);
  401.     WriteNl (f);
  402.       END;
  403.     WriteS (f, "CONST yyNil    = 374C;"); WriteNl (f);
  404.     WriteS (f, "CONST yyNoLabel    = 375C;"); WriteNl (f);
  405.     WriteS (f, "CONST yyLabelDef    = 376C;"); WriteNl (f);
  406.     WriteS (f, "CONST yyLabelUse    = 377C;"); WriteNl (f);
  407.     WriteNl (f);
  408.       IF IsElement (ORD ('p'), Options) THEN
  409.     WriteS (f, "PROCEDURE Put"); WI (iModule); WriteS (f, " (yyyf: IO.tFile; yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
  410.     WriteS (f, " BEGIN"); WriteNl (f);
  411.     WriteS (f, "  yyf := yyyf;"); WriteNl (f);
  412.     WriteS (f, "  IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;"); WriteNl (f);
  413.     WriteS (f, "  INC (yyRecursionLevel);"); WriteNl (f);
  414.     WriteS (f, "  yyMark (yyt);"); WriteNl (f);
  415.     WriteS (f, "  yyPut"); WI (iModule); WriteS (f, " (yyt);"); WriteNl (f);
  416.     WriteS (f, "  DEC (yyRecursionLevel);"); WriteNl (f);
  417.     WriteS (f, " END Put"); WI (iModule); WriteS (f, ";"); WriteNl (f);
  418.     WriteNl (f);
  419.     WriteS (f, "PROCEDURE yyPut"); WI (iModule); WriteS (f, " (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
  420.     WriteS (f, " BEGIN"); WriteNl (f);
  421.     WriteS (f, "  LOOP"); WriteNl (f);
  422.     WriteS (f, "   IF yyt = "); WI (iNoTree); WriteS (f, " THEN"); WriteNl (f);
  423.     WriteS (f, "    IO.WriteC (yyf, yyNil); RETURN;"); WriteNl (f);
  424.     WriteS (f, "   ELSIF yyt^.yyHead.yyMark = 0 THEN"); WriteNl (f);
  425.     WriteS (f, "    IO.WriteC (yyf, yyLabelUse); yyLabel := yyMapToLabel (yyt); yyPut (yyLabel);"); WriteNl (f);
  426.     WriteS (f, "    RETURN;"); WriteNl (f);
  427.     WriteS (f, "   ELSIF yyt^.yyHead.yyMark > 1 THEN"); WriteNl (f);
  428.     WriteS (f, "    IO.WriteC (yyf, yyLabelDef); yyLabel := yyMapToLabel (yyt); yyPut (yyLabel);"); WriteNl (f);
  429.     IF ClassCount > 251 THEN
  430.     WriteS (f, "    yyPut (yyt^.Kind);"); WriteNl (f);
  431.     WriteS (f, "   ELSIF yyt^.Kind > 251 THEN"); WriteNl (f);
  432.     WriteS (f, "    IO.WriteC (yyf, yyNoLabel); yyPut (yyt^.Kind);"); WriteNl (f);
  433.     ELSE
  434.     WriteS (f, "    IO.WriteC (yyf, CHR (yyt^.Kind));"); WriteNl (f);
  435.     END;
  436.     WriteS (f, "   ELSE"); WriteNl (f);
  437.     WriteS (f, "    IO.WriteC (yyf, CHR (yyt^.Kind));"); WriteNl (f);
  438.     WriteS (f, "   END;"); WriteNl (f);
  439.     WriteS (f, "   yyt^.yyHead.yyMark := 0;"); WriteNl (f);
  440.     WriteNl (f);
  441.     WriteS (f, "   CASE yyt^.Kind OF"); WriteNl (f);
  442.     ForallClasses (Classes, PutAttributes);
  443.     WriteS (f, "   ELSE RETURN;"); WriteNl (f);
  444.     WriteS (f, "   END;"); WriteNl (f);
  445.     WriteS (f, "  END;"); WriteNl (f);
  446.     WriteS (f, " END yyPut"); WI (iModule); WriteS (f, ";"); WriteNl (f);
  447.     WriteNl (f);
  448.     WriteS (f, "PROCEDURE yyPut (VAR yyx: ARRAY OF SYSTEM.BYTE);"); WriteNl (f);
  449.     WriteS (f, " VAR yyi    : INTEGER;"); WriteNl (f);
  450.     WriteS (f, " BEGIN"); WriteNl (f);
  451.     WriteS (f, "  yyi := IO.Write (yyf, SYSTEM.ADR (yyx), INTEGER (HIGH (yyx)) + 1);"); WriteNl (f);
  452.     WriteS (f, " END yyPut;"); WriteNl (f);
  453.     WriteNl (f);
  454.     WriteS (f, "PROCEDURE yyPutIdent (yyi: Idents.tIdent);"); WriteNl (f);
  455.     WriteS (f, " VAR yys    : Strings.tString;"); WriteNl (f);
  456.     WriteS (f, " BEGIN"); WriteNl (f);
  457.     WriteS (f, "  Idents.GetString (yyi, yys);"); WriteNl (f);
  458.     WriteS (f, "  Strings.WriteL (yyf, yys);"); WriteNl (f);
  459.     WriteS (f, " END yyPutIdent;"); WriteNl (f);
  460.     WriteNl (f);
  461.       END;
  462.       IF IsElement (ORD ('g'), Options) THEN
  463.     WriteS (f, "PROCEDURE Get"); WI (iModule); WriteS (f, " (yyyf: IO.tFile): "); WI (itTree); WriteS (f, ";"); WriteNl (f);
  464.     WriteS (f, " VAR yyt    : "); WI (itTree); WriteS (f, ";"); WriteNl (f);
  465.     WriteS (f, " BEGIN"); WriteNl (f);
  466.     WriteS (f, "  yyf := yyyf;"); WriteNl (f);
  467.     WriteS (f, "  IF yyRecursionLevel = 0 THEN yyLabelCount := 0; END;"); WriteNl (f);
  468.     WriteS (f, "  INC (yyRecursionLevel);"); WriteNl (f);
  469.     WriteS (f, "  yyGet"); WI (iModule); WriteS (f, " (SYSTEM.ADR (yyt));"); WriteNl (f);
  470.     WriteS (f, "  DEC (yyRecursionLevel);"); WriteNl (f);
  471.     WriteS (f, "  RETURN yyt;"); WriteNl (f);
  472.     WriteS (f, " END Get"); WI (iModule); WriteS (f, ";"); WriteNl (f);
  473.     WriteNl (f);
  474.     WriteS (f, "PROCEDURE yyGet"); WI (iModule); WriteS (f, " (yyt: yyPtrtTree);"); WriteNl (f);
  475.     WriteS (f, " BEGIN"); WriteNl (f);
  476.     WriteS (f, "  LOOP"); WriteNl (f);
  477.     WriteS (f, "   yyc := IO.ReadC (yyf);"); WriteNl (f);
  478.     WriteS (f, "   CASE yyc OF"); WriteNl (f);
  479.     WriteS (f, "   | yyNil    : yyt^ := "); WI (iNoTree); WriteS (f, "; RETURN;"); WriteNl (f);
  480.     WriteS (f, "   | yyLabelUse    : yyGet (yyLabel); yyt^ := yyMapToTree (yyLabel); RETURN;"); WriteNl (f);
  481.     WriteS (f, "   | yyLabelDef    : yyGet (yyLabel);"); 
  482.     IF ClassCount > 251 THEN
  483.     WriteS (f, " yyGet (yyKind);"); 
  484.     ELSE
  485.     WriteS (f, " yyKind := ORD (IO.ReadC (yyf));"); 
  486.     END;
  487.     WriteS (f, " yyt^ := Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
  488.     WriteS (f, "    IF yyLabel # yyMapToLabel (yyt^) THEN IO.WriteS (IO.StdError, '"); WI (iModule); WriteS (f, ": error in Get"); 
  489.     WI (iModule); WriteS (f, "'); IO.WriteNl (IO.StdError); yyExit; END;"); WriteNl (f);
  490.     IF ClassCount > 251 THEN
  491.     WriteS (f, "   | yyNoLabel    : yyGet (yyKind); yyt^ := Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
  492.     END;
  493.     WriteS (f, "   ELSE yyKind := ORD (yyc); yyt^ := Make"); WI (iMain); WriteS (f, " (yyKind);"); WriteNl (f);
  494.     WriteS (f, "   END;"); WriteNl (f);
  495.     WriteNl (f);
  496.     WriteS (f, "   CASE yyKind OF"); WriteNl (f);
  497.     ForallClasses (Classes, GetAttributes);
  498.     WriteS (f, "   ELSE RETURN;"); WriteNl (f);
  499.     WriteS (f, "   END;"); WriteNl (f);
  500.     WriteS (f, "  END;"); WriteNl (f);
  501.     WriteS (f, " END yyGet"); WI (iModule); WriteS (f, ";"); WriteNl (f);
  502.     WriteNl (f);
  503.     WriteS (f, "PROCEDURE yyGet (VAR yyx: ARRAY OF SYSTEM.BYTE);"); WriteNl (f);
  504.     WriteS (f, " VAR yyi    : INTEGER;"); WriteNl (f);
  505.     WriteS (f, " BEGIN"); WriteNl (f);
  506.     WriteS (f, "  yyi := IO.Read (yyf, SYSTEM.ADR (yyx), INTEGER (HIGH (yyx)) + 1);"); WriteNl (f);
  507.     WriteS (f, " END yyGet;"); WriteNl (f);
  508.     WriteNl (f);
  509.     WriteS (f, "PROCEDURE yyGetIdent (VAR yyi: Idents.tIdent);"); WriteNl (f);
  510.     WriteS (f, " VAR yys    : Strings.tString;"); WriteNl (f);
  511.     WriteS (f, " BEGIN"); WriteNl (f);
  512.     WriteS (f, "  Strings.ReadL (yyf, yys);"); WriteNl (f);
  513.     WriteS (f, "  yyi := Idents.MakeIdent (yys);"); WriteNl (f);
  514.     WriteS (f, " END yyGetIdent;"); WriteNl (f);
  515.     WriteNl (f);
  516.       END;
  517. ;
  518.       RETURN;
  519.      END;
  520.  
  521.   END;
  522.  END TreeIO;
  523.  
  524. PROCEDURE WriteNodeName (t: Tree.tTree);
  525.  VAR yyTempo: RECORD CASE : INTEGER OF
  526.  END; END;
  527.  BEGIN
  528.   IF t = Tree.NoTree THEN RETURN; END;
  529.   IF (t^.Kind = Tree.Class) THEN
  530. (* line 397 "" *)
  531.      WITH t^.Class DO
  532. (* line 397 "" *)
  533.       
  534.     IF (NoCodeClass * Properties) = {} THEN
  535.        WriteS (f, "| "); WI (Name); WriteS (f, ": IO.WriteS (yyf, '"); WI (Name); WriteS (f, "'); yyWriteNl;"); 
  536.        IF ({HasChildren, HasAttributes} * Properties) # {} THEN
  537.           WriteS (f, " yWriteNode"); WI (Name); WriteS (f, " (yyt);"); 
  538.        END;
  539.        WriteNl (f);
  540.     END;
  541. ;
  542.       RETURN;
  543.      END;
  544.  
  545.   END;
  546.  END WriteNodeName;
  547.  
  548. PROCEDURE WriteNode (t: Tree.tTree);
  549.  VAR yyTempo: RECORD CASE : INTEGER OF
  550.  END; END;
  551.  BEGIN
  552.   IF t = Tree.NoTree THEN RETURN; END;
  553.   IF (t^.Kind = Tree.Class) THEN
  554. (* line 410 "" *)
  555.      WITH t^.Class DO
  556. (* line 410 "" *)
  557.       
  558.     IF ((NoCodeClass * Properties) = {}) AND
  559.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  560.        WriteS (f, "PROCEDURE yWriteNode"); WI (Name); WriteS (f, " (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
  561.        WriteS (f, " BEGIN"); WriteNl (f);
  562.        IF (BaseClass^.Kind = Tree.Class) AND        (* NOT Top ? *)
  563.           (({HasChildren, HasAttributes} * BaseClass^.Class.Properties) # {}) THEN
  564.        WriteS (f, "  yWriteNode"); WI (BaseClass^.Class.Name); WriteS (f, " (yyt); "); WriteNl (f);
  565.        END;
  566.        iClassName := Name;
  567.        ForallAttributes (Attributes, WriteNode);
  568.        WriteS (f, " END yWriteNode"); WI (Name); WriteS (f, ";"); WriteNl (f);
  569.        WriteNl (f);
  570.     END;
  571. ;
  572.       RETURN;
  573.      END;
  574.  
  575.   END;
  576.   IF (t^.Kind = Tree.Child) THEN
  577. (* line 425 "" *)
  578.      WITH t^.Child DO
  579. (* line 425 "" *)
  580.       
  581.     WriteS (f, "  yyWriteSelector ('"); WI (Name); WriteS (f, "');"); 
  582.     WriteS (f, " yyWriteAdr (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ");"); WriteNl (f);
  583. ;
  584.       RETURN;
  585.      END;
  586.  
  587.   END;
  588.   IF (t^.Kind = Tree.Attribute) THEN
  589. (* line 429 "" *)
  590.      WITH t^.Attribute DO
  591. (* line 429 "" *)
  592.       
  593.     IF (NoCodeAttr * Properties) = {} THEN 
  594.        WriteS (f, "  yyWriteSelector ('"); WI (Name); WriteS (f, "'); write"); WI (Type);
  595.        WriteS (f, " (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ") yyWriteNl;"); WriteNl (f);
  596.     END;
  597. ;
  598.       RETURN;
  599.      END;
  600.  
  601.   END;
  602.  END WriteNode;
  603.  
  604. PROCEDURE Mark (t: Tree.tTree);
  605.  VAR yyTempo: RECORD CASE : INTEGER OF
  606.  END; END;
  607.  BEGIN
  608.   IF t = Tree.NoTree THEN RETURN; END;
  609.   IF (t^.Kind = Tree.Class) THEN
  610. (* line 439 "" *)
  611.      WITH t^.Class DO
  612. (* line 439 "" *)
  613.       
  614.     IF ((NoCodeClass * Properties) = {}) AND (HasChildren IN Properties) THEN
  615.        WriteS (f, "| "); WI (Name); WriteS (f, ":"); WriteNl (f);
  616.        GetIterator (t);
  617.        iClassName := Name;
  618.        ForallAttributes (t, Mark);
  619.        IF Iterator = NoTree THEN
  620.           WriteS (f, "RETURN;"); WriteNl (f);
  621.        ELSE
  622.           WriteS (f, "yyt := yyt^."); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, ";"); WriteNl (f);
  623.        END;
  624.     END;
  625. ;
  626.       RETURN;
  627.      END;
  628.  
  629.   END;
  630.   IF (t^.Kind = Tree.Child) THEN
  631. (* line 452 "" *)
  632.      WITH t^.Child DO
  633. (* line 452 "" *)
  634.       
  635.     IF t # Iterator THEN
  636.        WriteS (f, "yyMark (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ");"); WriteNl (f);
  637.     END;
  638. ;
  639.       RETURN;
  640.      END;
  641.  
  642.   END;
  643.  END Mark;
  644.  
  645. PROCEDURE WriteClassName (t: Tree.tTree);
  646.  VAR yyTempo: RECORD CASE : INTEGER OF
  647.  END; END;
  648.  BEGIN
  649.   IF t = Tree.NoTree THEN RETURN; END;
  650.   IF (t^.Kind = Tree.Class) THEN
  651. (* line 461 "" *)
  652.      WITH t^.Class DO
  653. (* line 461 "" *)
  654.       
  655.     IF (NoCodeClass * Properties) = {} THEN
  656.        WriteS (f, "| "); WI (Name); WriteS (f, ": "); 
  657.        IF ({HasChildren, HasAttributes} * Properties) # {} THEN
  658.           WriteS (f, "yWrite"); WI (Name); WriteS (f, " (yyt); "); 
  659.           GetIterator (t);
  660.           IF Iterator = NoTree THEN
  661.          WriteS (f, "EXIT;"); WriteNl (f);
  662.           ELSE
  663.          WriteS (f, "yyIndentSelector ('"); WI (Iterator^.Child.Name); WriteS (f, "'); "); 
  664.          WriteS (f, "yyt := yyt^."); WI (Name); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, ";"); WriteNl (f);
  665.           END;
  666.        ELSE
  667.           WriteS (f, "IO.WriteS (yyf, '"); WI (Name); WriteS (f, "'); yyWriteNl; EXIT;"); WriteNl (f);
  668.        END;
  669.     END;
  670. ;
  671.       RETURN;
  672.      END;
  673.  
  674.   END;
  675.  END WriteClassName;
  676.  
  677. PROCEDURE WriteAttributes (t: Tree.tTree);
  678.  VAR yyTempo: RECORD CASE : INTEGER OF
  679.  END; END;
  680.  BEGIN
  681.   IF t = Tree.NoTree THEN RETURN; END;
  682.   IF (t^.Kind = Tree.Class) THEN
  683. (* line 482 "" *)
  684.      WITH t^.Class DO
  685. (* line 482 "" *)
  686.       
  687.     IF ((NoCodeClass * Properties) = {}) AND
  688.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  689.        WriteS (f, "PROCEDURE yWrite"); WI (Name); WriteS (f, " (yyt: "); WI (itTree); WriteS (f, ");"); WriteNl (f);
  690.        WriteS (f, " BEGIN"); WriteNl (f);
  691.        WriteS (f, "  IO.WriteS (yyf, '"); WI (Name); WriteS (f, "'); yyWriteNl;"); WriteNl (f);
  692.        GetIterator (t);
  693.        iClassName := Name;
  694.        ForallAttributes (t, WriteAttributes);
  695.        WriteS (f, " END yWrite"); WI (Name); WriteS (f, ";"); WriteNl (f);
  696.        WriteNl (f);
  697.     END;
  698. ;
  699.       RETURN;
  700.      END;
  701.  
  702.   END;
  703.   IF (t^.Kind = Tree.Child) THEN
  704. (* line 495 "" *)
  705.      WITH t^.Child DO
  706. (* line 495 "" *)
  707.       
  708.     IF t # Iterator THEN
  709.        WriteS (f, "  yyIndentSelectorTree ('"); WI (Name); WriteS (f, "', yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ");"); WriteNl (f);
  710.     END;
  711. ;
  712.       RETURN;
  713.      END;
  714.  
  715.   END;
  716.   IF (t^.Kind = Tree.Attribute) THEN
  717. (* line 500 "" *)
  718.      WITH t^.Attribute DO
  719. (* line 500 "" *)
  720.       
  721.     IF (NoCodeAttr * Properties) = {} THEN 
  722.        WriteS (f, "  yyIndentSelector ('"); WI (Name); WriteS (f, "'); "); 
  723.        WriteS (f, "write"); WI (Type); WriteS (f, " (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ") yyWriteNl;"); WriteNl (f);
  724.     END;
  725. ;
  726.       RETURN;
  727.      END;
  728.  
  729.   END;
  730.  END WriteAttributes;
  731.  
  732. PROCEDURE ReadAttributes (t: Tree.tTree);
  733.  VAR yyTempo: RECORD CASE : INTEGER OF
  734.  END; END;
  735.  BEGIN
  736.   IF t = Tree.NoTree THEN RETURN; END;
  737.   IF (t^.Kind = Tree.Class) THEN
  738. (* line 510 "" *)
  739.      WITH t^.Class DO
  740. (* line 510 "" *)
  741.       
  742.     IF ((NoCodeClass * Properties) = {}) AND
  743.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  744.        WriteS (f, "| "); WI (Name); WriteS (f, ":"); WriteNl (f);
  745.        GetIterator (t);
  746.        iClassName := Name;
  747.        ForallAttributes (t, ReadAttributes);
  748.        IF Iterator = NoTree THEN
  749.           WriteS (f, "RETURN;"); WriteNl (f);
  750.        ELSE
  751.           WriteS (f, "yySkip; yyt := SYSTEM.ADR (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, ");"); WriteNl (f);
  752.        END;
  753.     END;
  754. ;
  755.       RETURN;
  756.      END;
  757.  
  758.   END;
  759.   IF (t^.Kind = Tree.Child) THEN
  760. (* line 524 "" *)
  761.      WITH t^.Child DO
  762. (* line 524 "" *)
  763.       
  764.     IF t # Iterator THEN
  765.        WriteS (f, "yySkip; read"); WI (itTree); WriteS (f, " (SYSTEM.ADR (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, "))"); WriteNl (f);
  766.     END;
  767. ;
  768.       RETURN;
  769.      END;
  770.  
  771.   END;
  772.   IF (t^.Kind = Tree.Attribute) THEN
  773. (* line 529 "" *)
  774.      WITH t^.Attribute DO
  775. (* line 529 "" *)
  776.       
  777.     IF (NoCodeAttr * Properties) = {} THEN 
  778.        WriteS (f, "yySkip; read"); WI (Type); WriteS (f, " (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ") yyReadNl;"); WriteNl (f);
  779.     END;
  780. ;
  781.       RETURN;
  782.      END;
  783.  
  784.   END;
  785.  END ReadAttributes;
  786.  
  787. PROCEDURE PutAttributes (t: Tree.tTree);
  788.  VAR yyTempo: RECORD CASE : INTEGER OF
  789.  END; END;
  790.  BEGIN
  791.   IF t = Tree.NoTree THEN RETURN; END;
  792.   IF (t^.Kind = Tree.Class) THEN
  793. (* line 538 "" *)
  794.      WITH t^.Class DO
  795. (* line 538 "" *)
  796.       
  797.     IF ((NoCodeClass * Properties) = {}) AND
  798.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  799.        WriteS (f, "| "); WI (Name); WriteS (f, ":"); WriteNl (f);
  800.        GetIterator (t);
  801.        iClassName := Name;
  802.        ForallAttributes (t, PutAttributes);
  803.        IF Iterator = NoTree THEN
  804.           WriteS (f, "RETURN;"); WriteNl (f);
  805.        ELSE
  806.           WriteS (f, "yyt := yyt^."); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, ";"); WriteNl (f);
  807.        END;
  808.     END;
  809. ;
  810.       RETURN;
  811.      END;
  812.  
  813.   END;
  814.   IF (t^.Kind = Tree.Child) THEN
  815. (* line 552 "" *)
  816.      WITH t^.Child DO
  817. (* line 552 "" *)
  818.       
  819.     IF t # Iterator THEN
  820.        WriteS (f, "put"); WI (itTree); WriteS (f, " (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ")"); WriteNl (f);
  821.     END;
  822. ;
  823.       RETURN;
  824.      END;
  825.  
  826.   END;
  827.   IF (t^.Kind = Tree.Attribute) THEN
  828. (* line 557 "" *)
  829.      WITH t^.Attribute DO
  830. (* line 557 "" *)
  831.       
  832.     IF (NoCodeAttr * Properties) = {} THEN 
  833.        WriteS (f, "put"); WI (Type); WriteS (f, " (yyt^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ")"); WriteNl (f);
  834.     END;
  835. ;
  836.       RETURN;
  837.      END;
  838.  
  839.   END;
  840.  END PutAttributes;
  841.  
  842. PROCEDURE GetAttributes (t: Tree.tTree);
  843.  VAR yyTempo: RECORD CASE : INTEGER OF
  844.  END; END;
  845.  BEGIN
  846.   IF t = Tree.NoTree THEN RETURN; END;
  847.   IF (t^.Kind = Tree.Class) THEN
  848. (* line 566 "" *)
  849.      WITH t^.Class DO
  850. (* line 566 "" *)
  851.       
  852.     IF ((NoCodeClass * Properties) = {}) AND
  853.        (({HasChildren, HasAttributes} * Properties) # {}) THEN
  854.        WriteS (f, "| "); WI (Name); WriteS (f, ":"); WriteNl (f);
  855.        GetIterator (t);
  856.        iClassName := Name;
  857.        ForallAttributes (t, GetAttributes);
  858.        IF Iterator = NoTree THEN
  859.           WriteS (f, "RETURN;"); WriteNl (f);
  860.        ELSE
  861.           WriteS (f, "yyt := SYSTEM.ADR (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Iterator^.Child.Name); WriteS (f, ");"); WriteNl (f);
  862.        END;
  863.     END;
  864. ;
  865.       RETURN;
  866.      END;
  867.  
  868.   END;
  869.   IF (t^.Kind = Tree.Child) THEN
  870. (* line 580 "" *)
  871.      WITH t^.Child DO
  872. (* line 580 "" *)
  873.       
  874.     IF t # Iterator THEN
  875.        WriteS (f, "get"); WI (itTree); WriteS (f, " (SYSTEM.ADR (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, "))"); WriteNl (f);
  876.     END;
  877. ;
  878.       RETURN;
  879.      END;
  880.  
  881.   END;
  882.   IF (t^.Kind = Tree.Attribute) THEN
  883. (* line 585 "" *)
  884.      WITH t^.Attribute DO
  885. (* line 585 "" *)
  886.       
  887.     IF (NoCodeAttr * Properties) = {} THEN 
  888.        WriteS (f, "get"); WI (Type); WriteS (f, " (yyt^^."); WI (iClassName); WriteS (f, "."); WI (Name); WriteS (f, ")"); WriteNl (f);
  889.     END;
  890. ;
  891.       RETURN;
  892.      END;
  893.  
  894.   END;
  895.  END GetAttributes;
  896.  
  897. PROCEDURE InitKindToIdent (t: Tree.tTree);
  898.  VAR yyTempo: RECORD CASE : INTEGER OF
  899.  END; END;
  900.  BEGIN
  901.   IF t = Tree.NoTree THEN RETURN; END;
  902.   IF (t^.Kind = Tree.Class) THEN
  903. (* line 594 "" *)
  904.      WITH t^.Class DO
  905. (* line 594 "" *)
  906.       
  907.     IF (NoCodeClass * Properties) = {} THEN
  908.        WriteS (f, "  yyInitKindToIdent2 ('"); WI (Name); WriteS (f, "', "); WI (Name); WriteS (f, ");"); WriteNl (f);
  909.     END;
  910. ;
  911.       RETURN;
  912.      END;
  913.  
  914.   END;
  915.  END InitKindToIdent;
  916.  
  917. PROCEDURE GetIterator (t: Tree.tTree);
  918.  VAR yyTempo: RECORD CASE : INTEGER OF
  919.  END; END;
  920.  BEGIN
  921.   IF t = Tree.NoTree THEN RETURN; END;
  922.   IF (t^.Kind = Tree.Class) THEN
  923. (* line 603 "" *)
  924.      WITH t^.Class DO
  925. (* line 603 "" *)
  926.       
  927.     Iterator := NoTree;
  928.     RevChild := NoTree;
  929.     ForallAttributes (t, GetIterator);
  930.     IF RevChild # NoTree THEN Iterator := RevChild; END;
  931. ;
  932.       RETURN;
  933.      END;
  934.  
  935.   END;
  936.   IF (t^.Kind = Tree.Child) THEN
  937. (* line 609 "" *)
  938.      WITH t^.Child DO
  939. (* line 609 "" *)
  940.       
  941.     Iterator := t;
  942.     IF Reverse IN Properties THEN RevChild := t; END;
  943. ;
  944.       RETURN;
  945.      END;
  946.  
  947.   END;
  948.  END GetIterator;
  949.  
  950. PROCEDURE BeginTreeMod2;
  951.  BEGIN
  952.  END BeginTreeMod2;
  953.  
  954. PROCEDURE CloseTreeMod2;
  955.  BEGIN
  956.  END CloseTreeMod2;
  957.  
  958. PROCEDURE yyExit;
  959.  BEGIN
  960.   IO.CloseIO; System.Exit (1);
  961.  END yyExit;
  962.  
  963. BEGIN
  964.  yyf    := IO.StdOutput;
  965.  Exit    := yyExit;
  966.  BeginTreeMod2;
  967. END TreeMod2.
  968.